package edu.isistan.microops;

import java.util.Vector;

import org.drools.runtime.rule.FactHandle;

import edu.isistan.microops.rules.RulesEngine;


/**
 * @author 
 * Avellaneda, Juan Cruz
 * Burgos, Agust�n
 * Obregozo, Manuel
 *
 * Esta clase corresponde al dise�o del algoritmo
 * el cual se basa en el patron de dise�o
 * chain of responsability. Las clases que extiendan de
 * esta dar�n forma al algoritmo que calcula
 * las microoperaciones de adaptaci�n.
 */
public class MicroopsCalculator {

	private RulesEngine ruleEngine;
	private Mapping mapping;
	
	
	
	public MicroopsCalculator(RulesEngine ruleEngine) {
		super();
		this.ruleEngine = ruleEngine;
	}

	/**
	 * Este metodo inicializa el mapping seteando los valores
	 * necesarios que fueron pasados por parametro y luego
	 * invoca al metodo getMicroops() encargado de obtener
	 * el listado de micro-adaptaciones asociado a dicho
	 * mapping.
	 * @param sourceName
	 * @param sourceType
	 * @param targetName
	 * @param targetType
	 * @return getMicroops()
	 */
	public Vector<String> calculateMicroops(String sourceName, String sourceType, String targetName, String targetType){
		
		mapping = new Mapping(sourceType, targetType, sourceName, targetName, new Vector<String>());
				
		return getMicroops();
	}
	
	/**
	 * Este metodo consulta al motor de reglas y retorna
	 * el listado de micro-adaptaciones asociados al mapping. 
	 * @return microops
	 */
	private Vector<String> getMicroops(){
		
		consultRuleEngine(mapping);
		return mapping.getMicroops();
	}
	
	/**
	 * Este metodo realiza el procedimiento necesario
	 * para la consulta al motor de reglas.
	 */
	private void consultRuleEngine(Mapping m){
		FactHandle fHandle = ruleEngine.insertFact(m);
		ruleEngine.fireAllRules();
		ruleEngine.retractFact(fHandle);
	}
	
}
